#include <iostream>
#include <stdlib.h>

#include <nemesis.Logger.h>

#include <nemesis.dbms.Connection.h>

#include <nemesis.dbos.AutoObject.h>

#include <dbos_demo.defines.h>

#include <dbos_demo.oodb.Table01.h>

#include <dbos_demo.phase.CanNotUseIncoherent.h>

using namespace std;
using namespace nemesis;
using namespace dbos_demo;

void phase::CanNotUseIncoherent::do_comment () const
   throw ()
{
   cout << "Carga un registro, realiza una copia e inntenta descargarla; al haber mas de una copia se obtendra una" << endl;
   cout << "excepcion; el objeto queda marcado como 'inchorente' y en cuanto su cuenta de utilizacion sea 0, se " << endl;
   cout << "destruira y se establecera un reusado rapido del hueco." << endl;
   cout << "Volvemos a cargar el mismo registro y verificamos que no nos deja usarlo" << endl;
}

void phase::CanNotUseIncoherent::do_apply (dbms::Connection& connection)
   throw (RuntimeException, dbms::DatabaseException)
{
   using namespace nemesis::dbms;

   Guard guard (connection);

   const int id (rand () % MaxKey01);

   dbos::AutoObject <oodb::Table01> table01_1;
   dbos::AutoObject <oodb::Table01> table01_2;
   dbos::AutoObject <oodb::Table01> table01_3;

   table01_1 = oodb::Table01::instanciate (connection, id);
    
   LOGINFORMATION (
      string msg (table01_1->asString ());
      msg += " | Primera carga";      
      Logger::information (msg, FILE_LOCATION);
   );
    
   table01_2 = table01_1;        
    
   LOGINFORMATION (
      string msg (table01_2->asString ());
      msg += " | Segunda copia";      
      Logger::information (msg, FILE_LOCATION);
   );

   try {
      oodb::Table01* instance = table01_1;
      oodb::Table01::erase (instance);      // NO podra descargarlo porque hay mas de una referencia
   }
   catch (Exception& ex) {
      ex.trace ();
   }
   
   try {
      LOGINFORMATION (
         Logger::information (functions::asString ("Intenta instanciar %d", id), FILE_LOCATION);
      );
      table01_3 = oodb::Table01::instanciate (connection, id);
   }
   catch (Exception& ex) {
      ex.trace ();
   }

   try {
      LOGINFORMATION (
         string msg ("Intenta duplicar la referencia ");
         msg += table01_1->asString ();
         Logger::information (msg, FILE_LOCATION);
      );
      table01_3 = table01_1;
   }
   catch (Exception& ex) {
      ex.trace ();
   }
}

 

